package com.springMVCStudy.config;

import com.springMVCStudy.interceptor.MyInterceptor;
import com.springMVCStudy.interceptor.MyInterceptor1;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ComponentScan({"com.springMVCStudy.controller", "com.springMVCStudy.error"})
@EnableWebMvc
public class MVCController implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 配置方案一：拦截全部请求
        //registry.addInterceptor(new MyInterceptor());

        // 配置方案二：指定地址拦截（*代表任意一层字符串，**代表任意多层字符串）
        //registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**");

        // 配置方案三：排除拦截，排除的地址拦截地应该包含于拦截地址
        //registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**").excludePathPatterns("/user/data2");

        /*
        如果添加多个拦截器，preHandle是先声明的先执行，postHandle和afterHandle则是先声明的后执行
        拦截器底层是用一个list存储，先声明的在前，preHandle顺序遍历执行，afterHandle逆序遍历执行
        ctrl+n搜索DispatcherServlet，找到doDispatch方法，在structure视图中找更方便。
        在550行调用了applyPreHandle，后面还有applyPostHandle，点进去查看源码可以了解到。
        后面调用的processDispatchResult点进去可以看到后面调用了triggerAfterCompletion这就是afterHandle运行的源码
         */

        registry.addInterceptor(new MyInterceptor());
        registry.addInterceptor(new MyInterceptor1());


    }
}
